|
Язык программирования
AL/IV - это
минимальный
императивный
объектно-ориентированный
платформенно-независимый
язык высокого
уровня
со статической типизацией,
претендующий на чрезвычайно высокую
степень надежности кода
управляемого уровня. |
A programming language
AL/IV is a minimal imperative
object oriented
platform independent
high-level
programming language
with static types,
claiming to a very
high level of safety and stability
of a controllable level of
code protection. |
Важные семантические особенности: |
Important semantic things of the language are:
|
|
NONE-объекты вместо NULL-ов
- Поля NONE-объектов всегда
равны NONE.
- Запись в поля
NONE-объектов игнорируется.
- Чтение полей
всегда дает нули и
NONE-объекты
соответствующих типов.
NONE-объекты возвращаются в случае обращения за
пределами массивов,
- и при потере объекта, на который имелась
ссылка.
- Все объектные переменные всегда
инициализированы значениями
NONE
- и никогда не имеют значение
NULL.
|
NONE-objects instead of NULLs
- fields of NONE objects are always equal to NONE.
- Writing to fields of
NONE-objects is ignored.
- Reading of fields gives always zeroes and
NONE-objects of
correspondent types.
NONE-objects are returned in a case when arrays
are accessed out of the array bounds,
- and when the object referenced was lost .
- All object variables
are always initialized with
NONE
- and never have value
NULL.
|
|
Разделение указателей на владеющие (сильные) и использующие_ (слабые)
- Сильные указатели не могут быть использованы для организации замкнутых
цепочек взаимного владения.
- Не нужен механизм сборки
мусора.
- Объект автоматически уничтожается, когда обнуляется его счетчик
использования сильными указателями.
- При
уничтожения объекта все слабые ссылки на него автоматически
перенаправляются на
NONE-объекты
соответствующего класса.
- Новые объекты либо должны адресоваться сильным указателем, либо
передаваться во владение ранее созданному объекту.
|
Separating references to objects onto strong (owning) and weak_ (using)
references
- Strong references can not be used to create closed link
chains between objects.
- Garbage collection is not necessary
at all.
- All objects are automatically destroyed when its usage (by
strong references) counters becomes zero.
- When the object is destroyed, all weak references onto it
immediately become referencing to
NONE objects of corresponding
class.
- New objects must be addressed either a strong pointer reference
or an existing object should be specified becoming an owner of the
creating object.
|
|
Полная
изоляция данных потока от других параллельно работающих
вычислительных потоков (примечание:
распараллеливание не
реализовано)
- Не требуются механизмы для исключительного
доступа к разделяемым объектам.
- Поток видит только свои объекты и
не
имеет доступа к объектам других потоков.
- Невозможны взаимные
блокировки потоков из-за доступа к данным.
- Глобальные переменные в языке AL/IV отсутствуют, поэтому проблемы с одновременным доступом к ним не возникают.
|
Total thread data isolation from other simultaneously executing threads
(Note: parallel working is not implemented yet)
- Special mechanisms to provide exclusive access to shared data are not necessary.
- A thread can access only its own objects
and
even does not see objects of other threads.
- There are not possible
deadlocks due to data access conflicts.
- There are no global variables so there are no problems with
simultaneous access them from different threads.
|
|
Управление распараллеливанием вычислений на уровне синтаксиса языка
- Блочный оператор
FORK.
- Иерархическая модель распараллеливания:
порождающий поток
знает только о своих дочерних потоках и
может их контролировать.
- Произвольные управляющие действия из других потоков запрещены.
|
Controlling threads on a language syntax level
- Block statement
FORK to organize parallel executing,
- Hierarchical
model of threads:
a thread which creates child threads, only can
control those.
- It is not possible to affect it from other threads.
|
|
Невозможность зацикливания и бесконечной рекурсии
- Циклы возможны только в форме
FOR var IN
arr[] : ... (нет циклов типа
WHILE/REPEAT-UNTIL). Есть
бесконечные циклы, но их использование жёстко ограничено.
Любой цикл FOR с переменной обязательно завершается, поэтому вечное зацикливание становится
невозможным.
- Рекурсивные функции обязательно помечаются маркером
RECURSIVE, и глубина рекурсии
контролируется: в
случае опасности бесконечной
рекурсии выполняется немедленный возврат к рекурсивному вызову первого уровня
в цепочке вызовов, и она возвращает NONE-значение.
|
Detection of infinitive loops and endless
recursions
- Loops are possible only in form
FOR var
IN
arr[] : ...
(there are no loops like
WHILE/REPEAT-UNTIL).
There are also infinite loops FOR, but
its usage is restricted hardly. Any loop FOR with a
variable is finished obligatory,
so infinitive looping become impossible.
- Recursive functions always are marked with a modifier
RECURSIVE,
and a recursion deep is controlled: in case of danger of too deep recursion an immediate return to
the first level of the recursion in the calls chain is performed and
it returns NONE value.
|
|
Оператор
PUSH для переменных
- В операторе
PUSH
для переменной сохраняется прежнее значение
и может присваиваться новое.
- По окончании блока, для переменной гарантированно восстанавливается ее значение.
|
PUSH statement for variables
and objects
- In a
PUSH statement for a
variable its value is stored and new value can be assigned.
- On a block end, stored value of a variable is restored always.
|
|
Параметры простых
типов всегда передаются "по
значению" и не могут изменяться в теле функции
- Повторное использование простых входных параметров
для хранения
промежуточных значений запрещено.
- Отсутствует возможность изменять значение скалярного параметра (кроме изменения полей объектного параметра).
- Для массива допускается изменение элементов, а для динамического
массива-параметра - добавление и удаление элементов.
|
Parameters passed
by value, can not be changed in a function
- Reusing input parameters
to store intermediate values is not
allowed.
- Value of a scalar parameter can not be changed until the function
ends.
- For an array parameter it is allowed to change items, and for
dynamic arrays - adding and deleting items.
|
|
Поля и переменные
класса "только для
чтения"
- Упрощают создание "свойств", которые может изменять только владелец
(класс и его наследники).
|
"Read only" fields and module variables
- Simplifies creating of "properties" which can be modified only
by the owner (class and its descendants).
|
|
Перечисления
- Являются прямыми аналогами перечислений других языков высокого
уровня.
- Позволяют работать с именованными константами и флажками.
- В качестве коллекции предлагается использовать булевские массивы
с индексами типа этих перечислений.
- Элементы перечислений заключаются в одинарные кавычки.
|
Enumerations and
collections
- These are very similar to enumerations and sets in Pascal-like
languages.
- These allow to work with named constants and flags.
- It is possible to use Boolean arrays with such enumerations as
indexes to implement collections of flags.
- Enumeration items are included into apostrophes.
|
|
Обработка исключений
не требуется, ввиду отсутствия исключений
- Никакие ошибки не могут изменить ход выполнения программы
непосредственно (путём немедленной передачи управления в другую
точку).
- Передача управления в рекурсивную функцию верхнего уровня при
превышении допустимого уровня рекурсии выполняется только для
ускорения обнаружения сбоя и предотвращения "зависания" в случае
большого числа вложенных циклов.
- Большинство ошибок подавляется путём замены предполагаемого
результата значением
NONE.
- Дополнительные средства обнаружения проблем
в процессе выполнения конечной программы в языке отсутствуют,
но могут использоваться встроенные в язык
средства тестирования.
|
There are no handling exception
instruments, since there are no exceptions
- There are no errors which could change execution flow
immediately (branching to another execution point).
- Passing control to a top level recursive function when a maximal
allowed level of a recursion is achieved is performed only to speed
up malfunction detection and to prevent stuck of execution in case
of a big amount of nested loops.
- Most of errors are ignored by replacing a supposed result with
the
NONE value.
- The are no additional tools to find problems at the execution
time but special test tools can be used embedded into the language.
|
|
Встроенные в язык средства
тестирования
- Функции
TEST позволяют
протестировать исходный код.
- Степень покрытия кода тестами оценивается компилятором.
- Модуль, недостаточно покрытый тестами, должен быть помечен
модификатором UNTESTED.
|
Embedded to the
language testing engine
- TEST functions allows to test code.
- Covering of the code by tests is measured by the compiler.
- A unit insufficiently covered by tests must be marked by the
modifier UNTESTED.
|
Важные синтаксические особенности: |
Important syntax things of the language are: |
|
Один класс - один модуль
- Один исходный текстовой файл содержит ровно один класс.
- Все публичные имена и параметры функций начинаются с заглавной
буквы, все скрытые поля и локальные переменные - со строчной буквы.
- Подчёркивание на конце имени используется только для имён
объектных полей класса, для индикации того, что поле является слабой
ссылкой на объект.
|
One class - one module
- Each source text file contains a single class definition.
- All public names and function parameters have names starting
from uppercase letter, all the hidden names and local variables are
starting from a lowercase letter.
- Underlining at the end of a name is used only for object fields
of class which are weak references to the ovject.
|
|
Двойное именование типов, переменных, функций, констант
- Большинство объектов (переменных, функций, типов данных) имеют
два имени.
- При декларации, полное имя делится на 2 части символом
'|', при этом часть до разделителя
является кратким именем объекта.
- Все сущности (за исключением
переменных цикла FOR)
обязаны иметь длинное имя не менее 8 символов.
- Ключевые слова языка записываются в верхнем регистре и не могут
употребляться для именования функций и переменных.
|
Double naming of types, variables,
functions, constants
- Most of objects (variables, functions, data types) have two names.
- In declarations, full name is separated onto 2 pars via a '|'.
The part before '|' is representing a short name of an item.
- All named things (excluding FOR loop variables) should have long names (at
least 8 characters).
- Language keywords are written in the uppercase and can not be
used to name functions or variables.
|
|
Классы и перечисления всегда
упоминаются в фигурных скобках.
- Имеется 4 простых типа данных:
BOOL,
INT|EGER, REAL, STR|ING.
- Классы и перечисления именуются в фигурных скобках, например,
{My|_class}.
- Имена классов в фигурных скобках начинаются с Прописной
буквы. Имена перечислений - со строчной.
- Нет типа char (используется
STR).
- Неявное преобразование типа возможно только из
INT в
REAL.
|
Names of classes and enumerations are always
written in figure brackets.
- The are 4 simple data types:
BOOL,
INT|EGER, REAL, STR|ING.
- Classes and enumerations are named using figure brackets, e.g.
{My|_class}.
- Classes have names in figure brackets
starting from uppercase. Enumeration names are always starting from
a lowercase letter.
- Type like "char" is not present (
STR is used).
- Implicit conversion is allowed only for converting
INT to
REAL.
|
|
Ограничение длины строк кода
- Исходный код не должен содержать строки длиннее 80 символов (не
считая комментариев и завершающих пробелов).
- Предыдущее правило не распространяется на строки, расположенные
за финальной директивой
END.
- Код продолжается в следующей строке, если строка завершается
одним из символов
- ',',
- '(' или
- '[',
- либо следующая строка
начинается с символа двойной кавычки.
|
Source code string length restriction
- Source code should not contain lines with length greater then 80
characters (not taking into account comments and ending spaces).
- The rule above is not affecting lines after the final directive
END.
- A line of code is continuing in the next line if it is ending
with one of character
- or if the next line is starting from a quotation character (").
|
|
Возможность вызова функции в постфиксной
форме для статических однопараметрических функций
- Вызов
Sin(x) эквивалентен
x.Sin.
|
Static function with a single parameter can be
called always in a postfix form
- Calling in form
sin(x) can be always replaced with
x.sin()
|
|
Массивы всегда упоминаются с
квадратными скобками: A[ ]
- Имеются только одномерные массивы.
- Массив может быть динамическим или фиксированным.
- Для фиксированного массива в качестве индексов может
использоваться перечисление (как тип).
|
Arrays are always
used together with its square brackets: A[ ]
- Only single dimension arrays are present.
- An array can be either dynamic or a fixed.
- For fixed arrays enumerations can be used as indexes (as data
types).
|
|
Строка содержит только один
оператор
- Символ ';' используется для
завершения блочного оператора (
CASE,
FOR, PUSH, DEBUG).
- Символ '.' завершает функцию,
перечисление, блок констант, список импорта.
- Символ завершения ';'
или '.' должен быть последним
таким же в строке (то есть два символа подряд ';
;' или '. .' не допускаются), но
указание '; .' в одной строке возможно.
- Простой оператор не требует специального символа для завершения
(и продолжается на другую строку символами '(',
'[', ',' или в случае, когда следующая строка начинается
двойной кавычкой).
- Любой простой оператор (кроме
BREAK,
CONTINUE или
STOP)
может быть завершён оператором выхода из функции '==>'.
|
A line of code
contains only a single statement
- Symbol ';' is used to end a block statement (
CASE,
FOR,
PUSH, DEBUG).
- Symbol '.' is ending a function, a enumeration, a constant block
or an import list.
- Ending symbol ';' or '.' must be the last such symbol in a line
(so, two semicolons are not possible but '; .' is allowed).
- Continuing a statement on the next line is allowed only if:
- the line is finished with '(', '[', ','
- or the next line is started with '"' (double quotation).
- Any simple statement (except
BREAK, CONTINUE
or
- ) can have a statement '==>' attached (return from a function
statement).
|
|
Ограничения на
качество кода:
- Допускается не более трёх уровней вложения операторов
CASE / FOR.
- Допускается не более 7 простых и 7 блочных операторов подряд в
одном блоке, после чего требуется наличие
комментария вида
------------------- 'комментарий'
- Допускается не более трёх явных параметров у функции (не считая
неявного параметра-объекта класса
THIS)
- В случае нарушения любого из приведённых правил, класс должен
быть помечен маркером плохого кода (
BAD).
|
Restrictions on a code
quality:
- It is allowed not more then 3 nested levels of block statements
CASE / FOR.
- It is allowed not more then 7 simple and 7 block statements in a
single block, after that a block comment is required (--------- 'comment').
- It is allowed not more then 3 explicit parameters of a function
(without implicit
THIS parameter).
- In case of abandoning any of rules listed above, a class must be
marked with a bad code modifier (
BAD).
|
В языке отсутствуют: |
The language has
lack of: |
|
Препроцессор
- Нет макросов (взамен - константные функции).
- Есть повторное использование кода - оператор LIKE.
Но он макросом с параметрами не является, не допускает
вложенных вызовов и обращений за пределами класса.
- Нет условной компиляции (взамен - константные функции в
условиях).
- Нет включения файлов.
|
Preprocessor
- There are no non-typed macros (though there is a LIKE statement,
but it is restricted and can not be used nested or out of class
bounds).
- There are no conditional compilations (constant functions in
conditions instead).
- There are no file includes.
|
|
Указатели функций
- Взамен указателей функций, имеется
механизм виртуальных методов.
- Функция в качестве параметра может быть передана только в
шаблонную функцию.
|
Function pointers
- There are no function pointers. Use instead virtual methods.
- A function can be "passed" as a parameter only to a generic
function.
|
|
Перегрузка функций
- В классе нет одноименных функций.
- При импорте одноименных статических функций из разных классов,
следует использовать явное указание класса при вызове функции, в
форме
{класс}.функция(параметры).
|
Overloading
- There are no same named functions in a module.
- While importing same named static functions and procedures it is
required to specify explicitly a class where these are from:
{class}.function(parameters).
|
|
Перегрузка
операторов
- Отсутствуют переопределяемые операторы.
|
Overloading operators
|
|
Массив как результат функции
- Функция может возвращать только скалярное значение.
- При необходимости возвратить массив, результат оформляется как
параметр.
|
Array as a result
of a function
- Function can return only a scalar value.
- If it is necessary to return an array, the result is passed is a
parameter.
|
|
Шаблоны классов
- Нет шаблонов для классов наподобие
List<T>.
- Списки и коллекции заменены динамическими массивами.
- Есть шаблонные статические функции, с ограничением на
единственный тип параметра, и с возможностью задать
статические параметры-функции (включая шаблонные).
|
Generic classes
- There are no generics for classes like
List<T>.
- Lists and collections are stored in dynamic arrays.
- There are generic static functions, with a restriction to a
single parametric data type, and with a capability to accept static
function parameters (including generic functions).
|
|
Множественное наследование
- Класс может быть унаследован только от одного класса-предка.
|
Multiple inheritance
- Class can be inherited only from one ancestor class.
|
|
Оператор go to
- Нет оператора
GOTO.
- Есть возможность продолжения или выхода из глубоко вложенного
цикла (
CONTINUE x,
BREAK x).
|
go to statement
- There is no
GOTO statements.
- It is possible to continue or break a loop from a deeply nested
block (
NEXT x, BREAK x).
|
|
Итераторы, задаваемые методом
- Нет возможности задавать произвольные итераторы.
- Есть итераторы элементов массивов FOR m IN
M[].
|
Iterators defined by methods
- It is not possible to define custom enumerators.
- There are array item enumerators FOR EACH m IN M[] DO
|
|
"Геттеры" и "сеттеры" с синтаксисом поля
- Поле или переменная не может иметь сеттер, обрабатывающий
присваивание нового значения, или геттер,
реализующий чтение из поля. Геттеры и
сеттеры существуют, но их назначение - обеспечивать возможность
переворачивания присваиваний (оператор REVERT).
- Чтение из поля - всегда является
просто чтением значения из памяти.
- Запись в поле всегда лишь выполняет запись значения в память.
|
"Getters" and "setters" with variable-like access
- A field or a variable can not have a setter which handles assignment of
new value, or setter which implements reading from value. There are
getters and setters but its purpose is in providing with capability
to use the statement REVERT.
- Reading a field always is simple reading a value from
memory.
- Writing to a field always just is simple writing a value to memory.
|
|
Символьный тип
данных
- Для представления символа используется строчная переменная или
константа длиной 1 символ.
|
Character data type
- To represent characters, string variables and constants of
length 1 are used.
|
|
Указание разрядности типов
данных
- Разрядность простых типов данных не указывается.
- Она всегда одинакова для всех типов INT,
REAL, STR, BOOL, и зависит от целевой
платформы, компилятора и настроек проекта.
|
Precision
specification for simple data type variables
- Precision is not specified.
- It is always same for embedded data types <int>, <real>,
<str>, <bool>.
|
|
Неявные преобразования разнородных типов данных
- Нет неявных преобразований переменных, кроме преобразования целого в вещественное.
- Нет приведения типов данных.
- Все преобразования выполняются явным вызовом функций.
|
Implicit type conversions for distinct data types
- There are no implicit data type conversions
except converting
INT to REAL.
- There are no type casts.
|
|
Низкоуровневое программирование
- Роль ассемблера выполняют "кодовые" (native)
функции языка, который является целевым для компилятора.
- Целевым может быть любой язык (например, С++, Objective C, Java, C#, Delphi, Python, Rubi, LUA, Shell, Algol,
Fortran, Oberon, ...).
- Вся низкоуровневая поддержка делается на целевом языке,
компилятору лишь указываются функции-переходники с атрибутом
NATIVE.
|
Low-level
programming
- Special NATIVE functions are used to implement wrappers
between high level language (AL-IV) and a target language, to
which source code is translated.
- Any programming language can be a target (e.g., C++, Objective
C, Java, C#, Delphi, Python, Rubi, LUA, Shell, Algol, Fortran,
Oberon, etc.).
- Entire low level support is written on a target language, and
just a set of wrapper functions is specified with attribute NATIVE.
|
|
Исключения
- В программе практически невозможны исключения, связанные с
неверной адресацией (благодаря использованию
NONE-объектов, гарантированной инициализации переменных,
проверкой выхода за границы массива).
- Во всех случаях, когда в обычных системах генерируется
исключение, в AL/IV не выполняются никакие
действия, и возвращается пустой результат (
NONE).
- Соответственно, в AL/IV не требуется
обработка исключений, и отсутствуют для этого средства.
|
Exceptions
- Exceptions due to an incorrect addressing are almost not
possible (because of
NONE objects, instant initializations of
variables, checking arrays bounds).
- In most cases when in other environments an exception is
generated, in AL/IV no actions are fired, and an empty result is
returned (
NONE).
- So, exception handling is not required, so exception handling is
not provided.
|